#include<stdio.h>
#include<math.h>
#define size 100
int detect(int a[size],int y)
{
 int b[10],x=y,r=ceil(log(x)/log(2)),i;
 printf("\nNo. of parity bits = %d",r);
 for(i=0;i<10;i++)
 b[i]=0;
 i=1;int code=0,sum=0;
 while(i<=r)
 {
  x=y;code=0;
  while(x>0)
  {
    if((x%int(pow(2,i)))>=int(pow(2,i-1)))
    code=code^a[x];
    x--;
   }
   i++;
   b[i-2]=code;
  }
  printf("\n");
  for(i=0;i<r;i++)
  sum+=b[i]*int(pow(2,i));
  return(sum);
 }
 void main()
{
 int x,a[size],hm[size],i,m=0,r=0;
 char c='y';
 printf("\nEnter data to be transmitted");
 while(c=='y'||c=='Y')
 {
  printf("\nEnter bit ");
  scanf("%d",&a[m]);
  m++;
  printf("Any more? (y/n) ");
  scanf(" %c",&c);
 }
 printf("\nNo. of message bits = %d",m);
 for(i=0;i<size;i++)
 hm[i]=0;
 while(int(pow(2,r))<(m+r+1))
 r++;
 printf("\nNo. of parity bits = %d",r);
 for(x=m+r,i=0;x>2,i<m;x--)
 {
  if(log(x)/log(2)!=int(log(x)/log(2)))
  { hm[x]=a[i]; i++; }
 }
 i=1;int code=0;
 while(i<=r)
 {
 x=m+r;code=0;
 while(x>0)
 {
  if((x%int(pow(2,i)))>=int(pow(2,i-1)))
  code=code^hm[x];
  x--;
 }
 i++;
 hm[int(pow(2,i-2))]=code;
}
printf("\nThe hamming code is ");
for(i=m+r;i>0;i--)
printf("%d",hm[i]);
printf("\n\nEnter the received data");
 c='y'; m=1;
 while(c=='y'||c=='Y')
 {
  printf("\nEnter bit ");
  scanf("%d",&a[m]);
  m++;
  printf("Any more? (y/n) ");
  scanf(" %c",&c);
 }
 for(i=0;i<size;i++) hm[i]=0;
 i=1;
 while(i<m)
 { hm[i]=a[m-i];i++;}
 int p=detect(hm,m-1);
 if(p!=0)
 printf("\nError at bit %d", p);
 else printf("\nNo error");
 printf("\nCorrect data is ");
 int n=m-1;
 if(p>m-1) n=p;
 for(i=n;i>0;i--)
 if(i==p)
 printf("%d",1-hm[i]);
 else printf("%d",hm[i]);
}

/***********OUTPUT***********/

Enter data to be transmitted
Enter bit 1
Any more? (y/n) y

Enter bit 1
Any more? (y/n) y

Enter bit 0
Any more? (y/n) y

Enter bit 0
Any more? (y/n) y

Enter bit 0
Any more? (y/n) y

Enter bit 0
Any more? (y/n) y

Enter bit 1
Any more? (y/n) y

Enter bit 1
Any more? (y/n) y

Enter bit 1
Any more? (y/n) y

Enter bit 1
Any more? (y/n) y

Enter bit 1
Any more? (y/n) y

Enter bit 1
Any more? (y/n) y

Enter bit 1
Any more? (y/n) n

No. of message bits = 10
No. of parity bits = 4
The hamming code is 11000001111100

Enter the received data
Enter bit 1
Any more? (y/n) y

Enter bit 1
Any more? (y/n) y

Enter bit 1
Any more? (y/n) y

Enter bit 0
Any more? (y/n) y

Enter bit 1
Any more? (y/n) y

Enter bit 0
Any more? (y/n) y

Enter bit 1
Any more? (y/n) y

Enter bit 0
Any more? (y/n) y

Enter bit 0
Any more? (y/n) y

Enter bit 0
Any more? (y/n) n

No. of parity bits = 4

Error at bit 9
Correct data is 1010101000


